////////////////////////////////////////////////////////////////////
// Programme de traitement des Rooms de Chrono Cross
// (les fonctions ont été gardées séparées pour permettre des
//  applications partielles sur certaines rooms lors du débogage
//  en choisissant une opération particulière)
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
// Nemesis pour Terminus Traduction (tt_nemesis@yahoo.fr)
// Date de création :		08/09/03
// Dernière modification :	07/02/04
////////////////////////////////////////////////////////////////////

// Entete
#include "Rooms.h"

// Type de données pour les fichiers
typedef struct {
	int deb;
	int fin;
} Room_TFich;

// Noms des fichiers et informations
Room_TFich Rooms_Outs[ROOMS_FICHS_NB];
_int16 Rooms_Nb;	// Nombre de fichiers
_int16 Rooms_Offset;// Fichier de base
_int16 Rooms_Saut;	// Nb de fichier entre 2 consécutifs
_int16 Rooms_Scenar;// Numéro du fichier de texte
char *Rooms_Table;

/*------------------------------------------------------------------
  Initialisation des fichiers Rooms
--------------------------------------------------------------------
 <- infos = fichiers des informations des Rooms à traiter
------------------------------------------------------------------*/
void Rooms_Infos (char *infos)
{
	// Fichier des infos
	FILE *infos_f;
	// Nom de l'iso (chemin)
	char infos_nom[ROOMS_NOM_MAX];
	// Numero de fichier
	int fich_deb,fich_fin;
	// Ligne
	char ligne[ROOMS_LIGNE_MAX];
	// Nombre de champs d'infos
	int result;

	Main_Message_S("Informations des rooms...","",OK);

	// Ouverture du fichier des infos principales
	sprintf(infos_nom,"%s%s%s%s.%s",
		DIR_INFOS,DIR_INFOS_GRP,infos,ROOMS_SUFFIXE,EXT_INFOS);
	infos_f=fopen(infos_nom,"rb");

	if (infos_f==NULL)
		Main_Message_S("Erreur d'ouverture des infos.\n","",ER);
	else {
		// Réinitialisation
		Rooms_Nb=0;
		// Nom de la table de caractères
		fgets(ligne,ROOMS_LIGNE_MAX,infos_f);
		ligne[strlen(ligne)-2]=0;
		Rooms_Table = strdup(ligne);
		// Numero de fichier d'offset
		fgets(ligne,ROOMS_LIGNE_MAX,infos_f);
		sscanf(ligne,"%d",&Rooms_Offset);
		// Saut entre les fichiers
		fgets(ligne,ROOMS_LIGNE_MAX,infos_f);
		sscanf(ligne,"%d",&Rooms_Saut);
		// Numero de fichier de texte
		fgets(ligne,ROOMS_LIGNE_MAX,infos_f);
		sscanf(ligne,"%d",&Rooms_Scenar);
		// Récupération des noms de fichiers
		while (fgets(ligne,ROOMS_LIGNE_MAX,infos_f)!=NULL)
			// Cas d'un commentaire ou d'un blanc
			if (ligne[0]!=COMMENT) {
				result=sscanf(ligne,"%d-%d",&fich_deb,&fich_fin);
				switch (result) {
				case 2:
					Rooms_Outs[Rooms_Nb].deb=fich_deb;
					Rooms_Outs[Rooms_Nb].fin=fich_fin;
					Rooms_Nb++;
					break;
				default:
					Main_Message_S("Info erronee... ","",ER);
				}
			}
		// Fermeture du fichier des infos
		fclose(infos_f);
	}

	Main_OK();
}

/*------------------------------------------------------------------
  Dump des Rooms
------------------------------------------------------------------*/
void Rooms_Dump (void)
{
	// Index des Rooms et des intervalles
	int f;

	Main_Message_S("Dump des fichiers Rooms...","",OK);

	// Dump effectif de TOUS les fichiers à cause
	// des décalages en réinsertion
	for(f=Rooms_Saut*Rooms_Outs[0].deb+Rooms_Offset;
		f<=Rooms_Saut*Rooms_Outs[Rooms_Nb-1].fin+Rooms_Offset+2;
		f++)
		Dump_Room(f);

	Main_OK();
}

/*------------------------------------------------------------------
  Copie entrante des Rooms (+ directe en sortie pour les inchangés)
------------------------------------------------------------------*/
void Rooms_Copie_I (void)
{
	// Index des Rooms et des intervalles
	int f,i;

	Main_Message_S("Copie entrante des fichiers Rooms...","",OK);

	// Copie effective
	for(i=0;i<Rooms_Nb;i++)
		// Parcours d'un intervalle
		for(f=Rooms_Outs[i].deb;f<=Rooms_Outs[i].fin;f++) {
			Fichier_Copie (Rooms_Saut*f+Rooms_Offset,
				DIR_DUMP_IN, DIR_FICH_IN, EXT_CPT);
			// Copie directe en sortie
			Fichier_Copie (Rooms_Saut*f+Rooms_Offset+1,
				DIR_DUMP_IN, DIR_DUMP_OUT, EXT_DRP);
			Fichier_Copie (Rooms_Saut*f+Rooms_Offset+2,
				DIR_DUMP_IN, DIR_DUMP_OUT, EXT_CPT);
		}
	Main_OK();
}

/*------------------------------------------------------------------
  Extraction des fichiers des Cpt de Rooms
------------------------------------------------------------------*/
void Rooms_Cpt_D (void)
{
	// Index des Rooms et des intervalles
	int f,i;

	Main_Message_S("Extraction des fichiers script...","",OK);

	// Extraction effective
	for(i=0;i<Rooms_Nb;i++)
		// Parcours d'un intervalle
		for(f=Rooms_Outs[i].deb;f<=Rooms_Outs[i].fin;f++)
			Cpt_Decompression("",Rooms_Saut*f+Rooms_Offset);

	Main_OK();
}

/*------------------------------------------------------------------
  Décompression Lzss du script des Rooms
------------------------------------------------------------------*/
void Rooms_Lzss_D (void)
{
	// Index des Rooms et des intervalles
	char dossier[ROOMS_NOM_MAX];
	int f,i;

	Main_Message_S("Decompression des scripts Lzss...","",OK);

	// Extraction effective
	for(i=0;i<Rooms_Nb;i++)
		// Parcours d'un intervalle
		for(f=Rooms_Outs[i].deb;f<=Rooms_Outs[i].fin;f++) {
			sprintf(dossier,"%s%04d\\",ENT_DOSSIER,
				Rooms_Saut*f+Rooms_Offset);
			Lzss_Decompression(dossier,Rooms_Scenar);
		}

	Main_OK();
}

/*------------------------------------------------------------------
  Extraction du script des Rooms
------------------------------------------------------------------*/
void Rooms_Extraction (void)
{
	// Index des Rooms et des intervalles
	char dossier[ROOMS_NOM_MAX];
	int f,i;

	Main_Message_S("Extraction du scenario...","",OK);

	Scn_Table(Rooms_Table,ROOMS_LECTURE);
	// Réinsertion effective
	for(i=0;i<Rooms_Nb;i++)
		// Parcours d'un intervalle
		for(f=Rooms_Outs[i].deb;f<=Rooms_Outs[i].fin;f++) {
			sprintf(dossier,"%s%04d\\",ENT_DOSSIER,
				Rooms_Saut*f+Rooms_Offset);
			Scn_Extraction(dossier,Rooms_Scenar);
		}

	Main_OK();
}

/*------------------------------------------------------------------
  Reinsertion du script des Rooms
------------------------------------------------------------------*/
void Rooms_Reinsertion (void)
{
	// Index des Rooms et des intervalles
	char dossier[ROOMS_NOM_MAX];
	int f,i;

	Main_Message_S("Reinsertion du scenario...","",OK);

	Scn_Table(Rooms_Table,ROOMS_ECRITURE);
	// Réinsertion effective
	for(i=0;i<Rooms_Nb;i++)
		// Parcours d'un intervalle
		for(f=Rooms_Outs[i].deb;f<=Rooms_Outs[i].fin;f++) {
			sprintf(dossier,"%s%04d\\",ENT_DOSSIER,
				Rooms_Saut*f+Rooms_Offset);
			Scn_Reinsertion(dossier,Rooms_Scenar);
		}

	Main_OK();
}

/*------------------------------------------------------------------
  Compression Lzss du script des Rooms
------------------------------------------------------------------*/
void Rooms_Lzss_C (void)
{
	// Index des Rooms et des intervalles
	char dossier[ROOMS_NOM_MAX];
	int f,i;

	Main_Message_S("Compression des scripts Lzss...","",OK);

	// Réinsertion effective
	for(i=0;i<Rooms_Nb;i++)
		// Parcours d'un intervalle
		for(f=Rooms_Outs[i].deb;f<=Rooms_Outs[i].fin;f++) {
			sprintf(dossier,"%s%04d\\",ENT_DOSSIER,
				Rooms_Saut*f+Rooms_Offset);
			Lzss_Compression(dossier,Rooms_Scenar);
		}

	Main_OK();
}

/*------------------------------------------------------------------
  Réinsertion des fichiers des Cpt de Rooms
------------------------------------------------------------------*/
void Rooms_Cpt_C (void)
{
	// Index des Rooms et des intervalles
	int f,i;

	Main_Message_S("Reinsertion des fichiers script...","",OK);

	// Réinsertion effective
	for(i=0;i<Rooms_Nb;i++)
		// Parcours d'un intervalle
		for(f=Rooms_Outs[i].deb;f<=Rooms_Outs[i].fin;f++) {
			Cpt_Compression("",Rooms_Saut*f+Rooms_Offset);
		}

	Main_OK();
}

/*------------------------------------------------------------------
  Copie entrante des Rooms
------------------------------------------------------------------*/
void Rooms_Copie_O (void)
{
	// Index des Rooms et des intervalles
	int f,i;

	Main_Message_S("Copie sortante des fichiers Rooms...","",OK);

	// Copie effective
	for(i=0;i<Rooms_Nb;i++)
		// Parcours d'un intervalle
		for(f=Rooms_Outs[i].deb;f<=Rooms_Outs[i].fin;f++)
			Fichier_Copie (Rooms_Saut*f+Rooms_Offset,
				DIR_FICH_OUT, DIR_DUMP_OUT, EXT_CPT);

	Main_OK();
}

/*------------------------------------------------------------------
  Réinsertion des Rooms
------------------------------------------------------------------*/
void Rooms_Rein (void)
{
	// Index des Rooms et des intervalles
	int f;

	Main_Message_S("Reinsertion des fichiers Rooms...","",OK);

	// Reinsertion effective de tous les fichiers
	for(f=Rooms_Saut*Rooms_Outs[0].deb+Rooms_Offset;
		f<=Rooms_Saut*Rooms_Outs[Rooms_Nb-1].fin+Rooms_Offset+Rooms_Saut-1;
		f++)
			Reinsertion_Room(f);

	Main_OK();
}